home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 1
/
Nebula One.iso
/
Mail
/
pine3.92
/
pine
/
osdep
/
debuging
< prev
next >
Wrap
Text File
|
1996-01-05
|
4KB
|
166 lines
#ifdef DEBUG
/*----------------------------------------------------------------------
Initialize debugging - open the debug log file
Args: none
Result: opens the debug logfile for dprints
Opens the file "~/.pine-debug1. Also maintains .pine-debug[2-4]
by renaming them each time so the last 4 sessions are saved.
----*/
void
init_debug()
{
char nbuf[5];
char newfname[MAXPATH+1], filename[MAXPATH+1];
int i;
if(!debug)
return;
for(i = NUMDEBUGFILES - 1; i > 0; i--){
build_path(filename, ps_global->home_dir, DEBUGFILE);
strcpy(newfname, filename);
sprintf(nbuf, "%d", i);
strcat(filename, nbuf);
sprintf(nbuf, "%d", i+1);
strcat(newfname, nbuf);
(void)rename_file(filename, newfname);
}
build_path(filename, ps_global->home_dir, DEBUGFILE);
strcat(filename, "1");
debugfile = fopen(filename, "w+");
if(debugfile != NULL){
time_t now = time((time_t *)0);
if(debug > 7)
setbuf(debugfile, NULL);
if(NUMDEBUGFILES == 0){
/*
* If no debug files are asked for, make filename a tempfile
* to be used for a record should pine later crash...
*/
if(debug < 9)
unlink(filename);
}
dprint(1, (debugfile, "Debug output of the Pine program (at debug"));
dprint(1, (debugfile, " level %d). Version %s\n%s\n",
debug, pine_version, ctime(&now)));
}
}
/*----------------------------------------------------------------------
Try to save the debug file if we crash in a controlled way
Args: dfile: pointer to open debug file
Result: tries to move the appropriate .pine-debugx file to .pine-crash
Looks through the four .pine-debug files hunting for the one that is
associated with this pine, and then renames it.
----*/
void
save_debug_on_crash(dfile)
FILE *dfile;
{
char nbuf[5], crashfile[MAXPATH+1], filename[MAXPATH+1];
int i;
struct stat dbuf, tbuf;
time_t now = time((time_t *)0);
if(!(dfile && fstat(fileno(dfile), &dbuf) != 0))
return;
fprintf(dfile, "\nsave_debug_on_crash: Version %s: debug level %d\n",
pine_version, debug);
fprintf(dfile, "\n : %s\n", ctime(&now));
build_path(crashfile, ps_global->home_dir, ".pine-crash");
fprintf(dfile, "\nAttempting to save debug file to %s\n", crashfile);
fprintf(stderr,
"\n\n Attempting to save debug file to %s\n\n", crashfile);
/* Blat out last n keystrokes */
fputs("========== Latest keystrokes ==========\n", dfile);
while((i = key_recorder(0, 1)) != -1)
fprintf(dfile, "\t%s\t(0x%04.4x)\n", pretty_command(i), i);
/* look for existing debug file */
for(i = 1; i <= NUMDEBUGFILES; i++){
build_path(filename, ps_global->home_dir, DEBUGFILE);
sprintf(nbuf, "%d", i);
strcat(filename, nbuf);
if(stat(filename, &tbuf) != 0)
continue;
/* This must be the current debug file */
if(tbuf.st_dev == dbuf.st_dev && tbuf.st_ino == dbuf.st_ino){
rename_file(filename, crashfile);
break;
}
}
/* if current debug file name not found, write it by hand */
if(i > NUMDEBUGFILES){
FILE *cfp;
char buf[1025];
/*
* Copy the debug temp file into the
*/
if(cfp = fopen(crashfile, "w")){
buf[1024] = '\0';
fseek(dfile, 0L, 0);
while(fgets(buf, 1025, dfile) && fputs(buf, cfp) != EOF)
;
fclose(cfp);
}
}
fclose(dfile);
}
#define CHECK_EVERY_N_TIMES 100
#define MAX_DEBUG_FILE_SIZE 200000L
/*
* This is just to catch runaway Pines that are looping spewing out
* debugging (and filling up a file system). The stop doesn't have to be
* at all precise, just soon enough to hopefully prevent filling the
* file system. If the debugging level is high (9 for now), then we're
* presumably looking for some problem, so don't truncate.
*/
int
do_debug(debug_fp)
FILE *debug_fp;
{
static int counter = CHECK_EVERY_N_TIMES;
static int ok = 1;
long filesize;
if(debug == DEFAULT_DEBUG && ok && --counter <= 0){
if((filesize = fp_file_size(debug_fp)) != -1L)
ok = (unsigned long)filesize < (unsigned long)MAX_DEBUG_FILE_SIZE;
counter = CHECK_EVERY_N_TIMES;
if(!ok){
fprintf(debug_fp, "\n\n --- No more debugging ---\n");
fprintf(debug_fp,
" (debug file growing too large - over %ld bytes)\n\n",
MAX_DEBUG_FILE_SIZE);
fflush(debug_fp);
}
}
return(ok);
}
#endif /* DEBUG */